package cn.cdutetc.library.service;

import cn.cdutetc.library.entity.dto.DashboardStatsDTO;
import cn.cdutetc.library.entity.dto.FinancialStatsDTO;

import java.time.LocalDate;
import java.util.List;

/**
 * 统计服务接口
 */
public interface StatisticsService {
    
    /**
     * 获取仪表板统计数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 仪表板统计数据
     */
    DashboardStatsDTO getDashboardStats(LocalDate startDate, LocalDate endDate);
    
    /**
     * 获取财务统计数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 财务统计数据
     */
    FinancialStatsDTO getFinancialStats(LocalDate startDate, LocalDate endDate);
    
    /**
     * 获取图书借阅趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param days 天数（当日期范围未指定时使用）
     * @return 借阅趋势数据
     */
    List<cn.cdutetc.library.entity.dto.ChartDataDTO> getBorrowTrend(LocalDate startDate, LocalDate endDate, Integer days);
    
    /**
     * 获取图书分类统计
     * @return 分类统计数据
     */
    List<cn.cdutetc.library.entity.dto.ChartDataDTO> getCategoryStats();
    
    /**
     * 获取财务趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param days 天数（当日期范围未指定时使用）
     * @return 财务趋势数据
     */
    List<cn.cdutetc.library.entity.dto.ChartDataDTO> getFinancialTrend(LocalDate startDate, LocalDate endDate, Integer days);
    
    /**
     * 获取热门图书排行
     * @param limit 限制数量
     * @return 热门图书排行
     */
    List<cn.cdutetc.library.entity.dto.BookRankDTO> getPopularBooks(Integer limit);
    
    /**
     * 获取活跃用户排行
     * @param limit 限制数量
     * @return 活跃用户排行
     */
    List<cn.cdutetc.library.entity.dto.UserRankDTO> getActiveUsers(Integer limit);
    
    /**
     * 获取借阅状态分布
     * @return 借阅状态分布数据
     */
    List<cn.cdutetc.library.entity.dto.ChartDataDTO> getBorrowStatusStats();
    
    /**
     * 获取用户角色分布
     * @return 用户角色分布数据
     */
    List<cn.cdutetc.library.entity.dto.ChartDataDTO> getUserRoleStats();
    
    /**
     * 获取新增用户数量（最近7天）
     * @return 新增用户数量
     */
    Long getNewUsersCount();
    
    /**
     * 获取活跃用户数量（最近7天有借阅记录）
     * @return 活跃用户数量
     */
    Long getActiveUsersCount();
}
